package com.ndp.fb.storage;

import com.ndp.fb.exception.S3Exception;

import java.io.File;
import java.io.IOException;

/**
 * 提供 EC core 所有的s3文件存储服务，不包括本地存储结构
 * 所有需要存储到S3 或者 从s3需要获取的文件均使用该服务
 * <p>
 * 约定了存储的目录结构，请不要在该服务之外 使用 S3ResourceManager 服务
 * 如果新加的目录结构或存储路径，请在该接口中添加方法
 * 尽量不要显示的在别的类中定义目录结构，一旦错误会很难处理。
 * Created by hunk.qin on 2016/4/17.
 */
public interface StorageService {


    /**
     * 保存build过程中产生的图片到s3 上，并生产可http 公开访问的URL
     * /root/${productid}/${materialId}/image/{imageFile.name}
     *
     * @param productId
     * @param materialStyleId
     * @return
     */
    String storeFeedImageAsPublic(String productId, Long materialStyleId, File imageFile) throws IOException;

    /**
     * 保存build过程中产生的图片到s3 上，并生产可http 公开访问的URL
     * /root/${productid}/${materialId}/image/{imageFile.name}
     *
     * @param productId
     * @param materialStyleId
     * @return
     */
    String storeFeedImageAsPublic(String productId, Long materialStyleId, File imageFile,String fileName) throws IOException;

    /**
     * 保存build出来新的feed 到s3上，并返回可 http 访问的地址，不包含域名
     * /root/${productid}/feed/${materialId}.xml/
     *
     * @param productId
     * @param materialStyleId
     * @param feedFile
     * @return
     */
    String storeFeedAsPublic(String productId, Long materialStyleId, File feedFile) throws IOException;

    /**
     * 保存 merge 后的 feed 到s3上，并返回可 http 访问的地址，不包含域名
     * /root/${productid}/feed/merge/${filename}.xml/
     *
     * @param productId
     * @param feedFile
     * @return
     */
    String storeMergeFeedAsPublic(String productId, File feedFile) throws IOException;


    /**
     * save 物料样式到s3上，并更新物料样式
     * /root/material_style/${materialStyleId.extension}
     *
     * @param materialStyleId
     */
    String storeMaterialStyle(Long materialStyleId, File materialStyleFile) throws IOException;



    /**
     * save 物料样式到s3上，并更新物料样式
     * /root/material_style/${materialStyleId.extension}
     *
     * @param materialStyleId
     */
    String storeMaterialStyleAsPublic(Long materialStyleId, File materialStyleFile) throws IOException;

    /**
     * 存储模板到s3上
     * /root/template/${templateid.extension}
     *
     * @param templateId
     * @return
     */
    String storeTemplate(Long templateId, File templateFile) throws IOException;


    String storeTemplateAsPublic(Long templateId, File templateFile) throws IOException;

    /**
     * 存储元素资源到s3上,如果 elementName 为null 使用 file name 如果filename 包含中文或特殊字符可能导致存储失败
     * <p>
     * 返回的URL为Http可访问的url，不包含域名
     * <p>
     * /root/resource/elementName
     *
     * @param resourceId
     * @param elementName
     * @return
     */
    String storeResourceAsPublic(Long resourceId, File element, String elementName) throws IOException;

    /**
     * 存储元素资源到s3上,如果 elementName 为null 使用 file name 如果filename 包含中文或特殊字符可能导致存储失败
     * <p>
     * 返回的URL为Http可访问的url，不包含域名
     * <p>
     * /root/element/code/elementName
     *
     * @param code
     * @param elementName
     * @return
     */
    String storeElementAsPublic(String code, File element, String elementName) throws IOException;

    /**
     * 如果font name 为null，使用file name，如果filename 包含中文或特殊字符可能导致存储失败
     * 返回的URL为http可访问的url，不包含域名
     * /root/font/fontName
     *
     * @param fontId
     * @param font
     * @param fontName
     * @return
     */
    String storeFontAsPublic(Long fontId, File font, String fontName) throws IOException;


    /**
     * 如果font name 为null，使用file name，如果filename 包含中文或特殊字符可能导致存储失败
     * 返回的URL为http可访问的url，不包含域名
     * /root/font/fontName
     *
     * @param fontId
     * @param font
     * @param fontName
     * @return
     */
    String storeFontAsPublicResultHttp(Long fontId, File font, String fontName) throws IOException;

    /**
     * 通过 S3 存储 path 获取flie，materialstyle，template，font ，resource 通用
     *
     * @param storePath
     * @return
     */
    File getS3File(String storePath) throws IOException, S3Exception;

    /**
     * 获取本地临时目录url
     *
     * @return
     */
    String getLocalTempDir() throws IOException;

    /**
     * 获取完整的http 可访问的url
     *
     * @param relativeUrl
     * @return
     */
    String getHttpUrl(String relativeUrl);

    String storeFeedImageAsPublicExist(String productId, Long materialStyleId,String checkpath);
    /**
     * 保存build过程中产生的图片到s3 上，并生产可http 公开访问的URL
     * /root/${productid}/${materialId}/image/{imageFile.name}
     *
     * @param productId
     * @param materialStyleId
     * @return
     */
    String storePSetExelAsPublic(String productSetId,String productSetName, File excelFile) throws IOException;

    void copyFile(String sourceKey, String descKey);

    String getFullFolder(String folder);

    String storeLogoAsPublic(String code, File logoFile, String name) throws IOException ;
}
